-- AvalonCannon
-- Create by dengc
-- 阿瓦隆巨炮

AvalonCannon = {
    classId = 0,
    skills = {},

    -- 对象类型为阿瓦隆巨炮
    type = OBJECT_TYPE_AVALON_CANNON,
}
AvalonCannon.__index = AvalonCannon;

-- 构造函数
function AvalonCannon.new(classId, data)
    local self = {};

    -- 元表设置为自己，继承巨炮对象
    setmetatable(self, AvalonCannon);
    self.classId = classId;
    self.dbase = Dbase.new(data);

    for key, value in pairs(data) do
        self[key] = value;
    end

    -- 记录下技能信息
    local skills = data.skills or {};
    self:setSkills(skills);

    -- 初始时记录下一些数值
    self.dbase:set("durability", self:getMaxDurability());
    self.dbase:set("cd", 0);

    local isLoad = data["is_load"] and data["is_load"] or 0;
    self.dbase:set("is_load", isLoad);

    self.dbase:set("last_max_cd", self:getMaxCountDown());

    return self;
end

-- 取得对象的描述字符串
function AvalonCannon:get_ob_id()
    return string.format("AvalonCannon:%s", tostring(self.classId));
end

-- 查找数据
function AvalonCannon:query(path, path2, default)
    local v = self.dbase:query(path, path2, default);
    if v then
        return v;
    end

    if path == "classId" or path == "class_id" then
        return self.classId;
    else
        return AvalonCannonM.query(self.classId, path);
    end
end

-- 设置耐久度
function AvalonCannon:setDurability(durability)
    local add = durability - self:getDurability();
    local baseDurability = self.dbase:query("durability", 0) + add;

    self.dbase:set("durability", baseDurability);

    AvalonCannonM.syncAvalonCannonData();
end

-- 设置冷却时间
function AvalonCannon:setCd(cd)
    self.dbase:set("cd", cd);

    AvalonCannonM.syncAvalonCannonData();
end

-- 设置自动装填弹药
function AvalonCannon:setIsLoad(flag)
    self.dbase:set("is_load", flag);
end

-- 查询是否已经自动填弹
function AvalonCannon:queryIsLoad()
    return self.dbase:query("is_load");
end

-- 阿瓦隆巨炮的技能
function AvalonCannon:getSkills()
    return EngineeringManualM.fetchAvalonSkills();
end

-- 查询属性
function AvalonCannon:queryAttrib(attrib, args)
    return AttribM.queryAttrib(self, attrib, args);
end

-- 获取最大耐久度
function AvalonCannon:getMaxDurability()
    return self:queryAttrib("max_durability");
end

-- 获取当前耐久度
function AvalonCannon:getDurability()
    return self:queryAttrib("durability");
end

-- 获取威力
function AvalonCannon:getAttack()
    return self:queryAttrib("attack");
end

-- 获取攻击范围
function AvalonCannon:getAttackRange()
    return self:queryAttrib("attack_range");
end

-- 获取命中
function AvalonCannon:getAccuracy()
    return self:queryAttrib("accuracy");
end

-- 获取攻击冷却时间
function AvalonCannon:getCountDown()
    return self.dbase:query("cd") or 0;
end

-- 获取最大的冷却时间
function AvalonCannon:getMaxCountDown()
    return FormulaM.invoke("CALA_AVALON_CANNON_MAX_CD", self);
end

-- 获取自动装填弹药概率
function AvalonCannon:getLoadRate()
    local rate = self:query("load_rate");
    local prop = PropM.combine(self, "load_ammunition", 1);

    return rate + prop[3];
end

-- 获取属主对象
function AvalonCannon:getOwner()
    -- 一定属于玩家对象
    return ME.user;
end

-- 获取当前位置
function AvalonCannon:getPos()
    return self.pos or self.dbase:query("pos");
end

-- 巨炮摧毁
function AvalonCannon:destory()
    -- 耐久度为0，才能够被摧毁
    if self:getDurability() > 0 then
        return;
    end

    DungeonLogM.addLog("[AvalonCannon]阿瓦隆巨炮被摧毁了。\n");

    -- 标记被摧毁
    self.dbase:set("is_destory", true);
end

-- 是否已被摧毁
function AvalonCannon:isDestory()
    -- 有摧毁标识
    if self.dbase:query("is_destory") then
        return true;
    end

    return false;
end

-- 阿瓦隆巨炮是否有技能
function AvalonCannon:ownSkill(skillId)
    local base = SkillM.findBaseSkill(skillId);
    for _, id in pairs(self.skills) do
        if SkillM.findBaseSkill(id) == base then
            return true;
        end
    end
    return false;
end

-- 获取技能等级
function AvalonCannon:getSkillLevel(skillId)
    local base = SkillM.findBaseSkill(skillId);
    for _, id in pairs(self.skills) do
        if SkillM.findBaseSkill(id) == base then
            return SkillM.query(id, "level");
        end
    end

    return 0;
end

-- 设置技能
function AvalonCannon:setSkills(skills)
    self.skills = skills;
end

-- 升级技能(由外部使用的人来进行检查)
function AvalonCannon:upgradeSkill(skillId)
    local base = SkillM.findBaseSkill(skillId);
    for index, id in pairs(self.skills) do
        if SkillM.findBaseSkill(id) == base then
            local next = SkillM.query(id, "next");
            self.skills[index] = next;

            break;
        end
    end
end

-- 学习技能
function AvalonCannon:learnSkill(skillId)
    table.insert(self.skills, skillId);
end

-- 获取数据
function AvalonCannon:getSaveData()
    local ret = {
        ["class_id"]     = self.classId,
        ["is_load"]      = self.dbase:query("is_load"),
        ["attack_addon"] = self.dbase:query("attack_addon"),
        ["skills"]       = self:getSkills(),
    };

    return ret;
end
